// function isObject(target) {
//   return typeof target === "object" && target !== null;
// }

// function deepClone(target, map = new WeakMap()) {
//   if (!isObject(target)) {
//     return target;
//   }

//   if (target instanceof Array) {
//     return target.map((item) => item);
//   }

//   if (target instanceof Function) {
//     return target; // 函数不需要深拷贝
//   }

//   if (target instanceof Date) {
//     return new Date(target);
//   }

//   if (target instanceof RegExp) {
//     return new RegExp(target);
//   }

//   if (target instanceof Set) {
//     return new Set(target);
//   }

//   if (map.has(target)) {
//     return map.get(target);
//   }

//   const newObj = Array.isArray(target) ? [] : {};
//   map.set(target, newObj);

//   for (const key in target) {
//     // hasOwnProperty: 判断对象自身属性中是否具有指定的属性
//     newObj[key] = deepClone(target[key], map);
//   }

//   const symbolKeys = Object.getOwnPropertySymbols(target);
//   for (const sKey of symbolKeys) {
//     newObj[Symbol(sKey.description)] = deepClone(target[sKey], map);
//   }

//   return newObj;
// }

// const set = new Set(["abc", "cba", "nba"]);
// const map = new Map([
//   ["a", 1],
//   ["b", 2],
// ]);
// const s1 = Symbol("s1");
// const s2 = Symbol("s2");
// const obj = {
//   name: "deepClone",
//   age: 18,
//   address: {
//     city: "北京",
//     home: {
//       name: "home",
//     },
//   },
//   arr: [1, 2, 3],

//   // 1.特殊类型: Set
//   set: set,

//   // 2.特性类型: function
//   running: function () {
//     console.log("running~");
//   },

//   // 3.值的特殊类型: Symbol
//   symbolKey: Symbol("abc"),

//   // 4.key是symbol时
//   [s1]: "aaaa",
//   [s2]: "bbbb",

//   // 5. map类型
//   map: map,
// };
// obj.info = obj; // 循环引用

// const newObj = deepClone(obj);
// console.log(obj, newObj);

// function foo(name) {
//   console.log(name);
// }

// function bar() {
//   return {
//     option(fn) {
//       fn("bar");
//     },
//   };
// }

// const obj = bar();

// obj.option(foo);

// function uniqueArray(arr) {
//   const result = [];
//   for (const item of arr) {
//     let isExist = false;
//     for (const resultItem of result) {
//       if (equal(item, resultItem)) {
//         isExist = true;
//         break;
//       }
//     }

//     if (!isExist) {
//       result.push(item);
//     }
//   }

//   return result;
// }

// function isObject(value) {
//   return typeof value === "object" && value !== null;
// }

// function equal(value1, value2) {
//   if (!isObject(value1) && !isObject(value2)) {
//     return value1 === value2;
//   }

//   const entries1 = Object.entries(value1);
//   const entries2 = Object.entries(value2);

//   if (entries1.length !== entries2.length) {
//     return false;
//   }

//   for (const [key, value] of entries1) {
//     if (value !== value2[key]) {
//       return false;
//     }
//   }

//   return true;
// }

// const res = uniqueArray([123, 2, 3, 3, 4]);
// console.log(res);

const obj = {
  a: {
    b: {
      c() {
        console.log('c')
      },
    },
  },
}

obj['a']['b']['c']()
